package com.sau.pixelcart.common.config;

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.codec.JsonJacksonCodec;
import org.redisson.config.Config;
import org.redisson.config.TransportMode;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RedissonConfig {

    @Value("${spring.redis.host}")
    private String redisHost;

    @Value("${spring.redis.port}")
    private int redisPort;

    @Value("${spring.redis.password}")
    private String redisPassword;

    @Value("${spring.redis.connectionPoolSize}")
    private int connectionPoolSize;

    @Value("${spring.redis.connectionMinimumIdleSize}")
    private int connectionMinimumIdleSize;

    @Bean(destroyMethod = "shutdown")
    public RedissonClient redissonClient() {
        Config config = new Config();

        // 使用NIO传输模式（推荐生产环境使用）
        config.setTransportMode(TransportMode.NIO);

        // 单节点模式配置（根据实际情况可选择集群/哨兵模式）
        String redisAddress = "redis://" + redisHost + ":" + redisPort;
        System.out.println("------------------"+redisAddress+"--------------------");
        config.useSingleServer()
                .setAddress(redisAddress)
                .setPassword(redisPassword)
                // 连接池配置
                .setConnectionPoolSize(connectionPoolSize)         // 最大连接数
                .setConnectionMinimumIdleSize(connectionMinimumIdleSize) // 最小空闲连接
                // 超时配置
                .setConnectTimeout(5000)    // 连接超时5s
                .setTimeout(3000)           // 命令等待超时3s
                .setRetryAttempts(3)        // 命令重试次数
                .setRetryInterval(1000)     // 命令重试间隔
                // 心跳检测
                .setPingConnectionInterval(60000); // 60秒心跳

        // 序列化配置（推荐使用JSON序列化）
        config.setCodec(new JsonJacksonCodec());

        // Watchdog配置（锁自动续期）
        config.setLockWatchdogTimeout(30000); // 默认30秒

        return Redisson.create(config);
    }

}
